深度学习100问-14:图像语义分割有哪些经典的上采样方法?
深度学习100问
Author:louwill
Machine Learning Lab
大家都知道目前主流的语义分割模型都是编码-解码框架的。通过编码器不断将输入不断进行下采样达到信息浓缩,而解码器则负责上采样来恢复输入尺寸。
目前已知的大多数分类网络,比如说VGG、ResNet、MobileNet、Inception和DenseNet等,均可用于分割时的信息编码,那么恢复图像像素的上采样方法都有哪些呢?
经典的上采样方法主要包括双线性插值法(Bilinear interpolation)、转置卷积法和反池化法(Unpooling)。本文笔者就和大家来看一下这些上采样方法。
双线性插值
插值法(Interpolation)是一种经典的数值分析方法,一些经典插值大家或多或少都有听到过,比如线性插值、三次样条插值和拉格朗日插值法等。在说双线性插值前我们先来了解一下什么是线性插值(Linear interpolation)。
线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。如下图所示:
已知直线上两点坐标分别为(x1,y1)和(x2,y2),现在想要通过线性插值法来得到某一点x在直线上的值。基本就是一个初中数学题,这里就不做国多展开,点x在直线上的值y可以表示为:
然后我们再来看双线性插值。线性插值用到两个点来确定插值,双线性插值则需要四个点。在图像上采样中,双线性插值利用四个点的像素值来确定要插值的一个像素值,其本质上还是分别在x和y方向上分别进行两次线性插值。如下图所示,我们来看具体做法。
图中Q11-Q22四个黄色的点是已知数据点,红色点P是待插值点。假设Q11为(x1,y1),Q12为(x1,y2),Q21为(x2,y1),Q22为(x2,y2)。我们先在x轴方向上进行线性插值,先求得R1和R2的插值。根据线性插值公式,有:
得到R1和R2点坐标之后,便可继续在y轴方向进行线性插值。可得目标点P的插值为:
双线性插值在众多经典的语义分割网络中都有用到,比如说奠定语义分割编解码框架的FCN网络。假设将3x6的图像通过双线性插值变为6x12的图像,如下图所示。
双线性插值的优点是速度非常快,计算量小,但缺点一般就是效果不是特别理想。
转置卷积
语义分割上采样另一种经典的、也是最主流的方法是转置卷积(Transposed Convolution),也有叫做反卷积或者解卷积。转置卷积本质上跟常规卷积并无太大差别,具体笔者在系列第6篇深度学习100问-6:有哪些经典的卷积类型?中已有详细阐述,本文就不再赘述。
常规卷积
转置卷积
转置卷积作为上采样方法效果要比双线性插值好一些,但缺点就是计算量偏大。
反池化
反池化(Unpooling)可以理解为池化的逆操作,相较于前两种上采样方法,反池化用的并不是特别多。其简要原理如下,在池化时记录下对应kernel中的坐标,在反池化时将一个元素根据kernel进行放大,根据之前的坐标将元素填写进去,其他位置补位为0即可。
如下图所示,a为输入图像,b为转置卷积的输出效果,c则是反池化的输出效果。
以上就是本文内容。
参考资料:
Learning Deconvolution Network for Semantic Segmentation